/*
 * @lc app=leetcode.cn id=300 lang=cpp
 *
 * [300] 最长递增子序列
 */

#include <limits.h>

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;

// @lc code=start
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int result = 0;
        int length = nums.size();           // 记录结点的数量
        vector<int> dp(length, 1);          // dp[i] 表示以第 i 个节点结尾的最长递增子序列长度

        // 特例，数组为空直接返回 0
        if (length == 0) return result;

        // 更新 dp 数组
        for (int i = 1; i < length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                }    
            }
        }
        
        // 从 dp 数组中寻找最大值
        for (int i = 0; i < length; i++) {
            result = max(result, dp[i]);
        }
        
        return result;
    }
};
// @lc code=end

